#pragma once

#include <memory>
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include "../core/message_receiver.hpp"
#include "../common/logger.hpp"
#include <nlohmann/json.hpp>

/**
 * @brief WebSocket会话类
 * 
 * 负责处理单个WebSocket连接的生命周期
 * 包括连接的建立、消息的读取和发送
 * 继承自enable_shared_from_this以支持异步操作
 */
class WebSocketSession : public std::enable_shared_from_this<WebSocketSession> {
public:
    /**
     * @brief 构造函数
     * @param socket TCP套接字，用于建立WebSocket连接
     * @param receiver 消息接收器，用于处理接收到的消息
     */
    WebSocketSession(boost::asio::ip::tcp::socket socket, IMessageReceiver& receiver, uint32_t session_id);

    /**
     * @brief 获取会话ID
     * @return 会话ID
     */
    uint32_t get_session_id() const { return session_id_; }

    /**
     * @brief 启动会话
     * 开始WebSocket握手过程
     */
    void start();

    /**
     * @brief 发送消息
     * @param message 消息
     */
    void send(const nlohmann::json& message);

private:
    /**
     * @brief 开始读取消息
     * 异步等待新的WebSocket消息
     */
    void do_read();

    /**
     * @brief 处理读取到的消息
     * @param ec 错误码
     * @param bytes_transferred 读取的字节数
     */
    void on_read(boost::beast::error_code ec, std::size_t bytes_transferred);

    /**
     * @brief 处理写入完成
     * @param ec 错误码
     * @param bytes_transferred 写入的字节数
     */
    void on_write(boost::beast::error_code ec, std::size_t bytes_transferred);
    
    boost::beast::websocket::stream<boost::asio::ip::tcp::socket> ws_;  ///< WebSocket流
    IMessageReceiver& receiver_;                                        ///< 消息接收器引用
    uint32_t session_id_;
    boost::beast::flat_buffer buffer_;                                  ///< 消息缓冲区
}; 